package com.zhu.instructions.math;

// instructions/math/IUSHR.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：iushr
 *
 * 操作数：无
 *
 * 功能：
 *  将栈顶的两个 int 值进行逻辑右移：value1 >>> value2
 *  逻辑右移总是补 0（无符号右移）
 *
 * 栈变化：
 *      ..., value1, value2 → ..., result
 *
 * 示例：
 *  (-8) >>> 1 = 2147483644（高位补0）
 *
 * 实现技巧：
 *  先转为无符号右移（uint32），再转回 int
 */
public class IUSHR extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        int v2 = stack.popInt(); // 位移量
        int v1 = stack.popInt(); // 被移动值

        int s = v2 & 0x1f;
        // Java 没有无符号 int，需手动处理：转为 long 再无符号右移
        int result = (int) ((v1 & 0xFFFFFFFFL) >>> s);
        stack.pushInt(result);
    }
}
